package cn.agiledata.bank.linkbank.exception;

import com.vnv.infrastructure.exception.IPBAppException;

public class LinkBankException extends IPBAppException {
	public static final LinkBankException FEE_EXCEED_AMOUNT = new LinkBankException(
    "error.merchant.feeexceedamount");
    public static final LinkBankException UNSUPPORTED_BANK = new LinkBankException(
            "error.bank.unsupported_bank");

    public static final LinkBankException UNSUPPORTED_NET_BANK = new LinkBankException(
            "error.bank.net.unsupported_bank");

    public static final LinkBankException UNSUPPORTED_TEL_BANK = new LinkBankException(
            "error.bank.tel.unsupported_bank");

    public static final LinkBankException DIGITAL_SIGN_VALIDATION_FAIL = new LinkBankException(
            "error.bank.net.digital_sign_validation_fail");

    public static final LinkBankException NOT_SAME_DAY = new LinkBankException(
            "error.bank.net.abc.query.not_same_day");

    public static final LinkBankException TRANSACTION_AFFIRMED = new LinkBankException(
            "error.bank.net.transaction_affirmed");

    public static final LinkBankException UNMATCHED_AMOUNT = new LinkBankException(
            "error.bank.net.unmatched_amount");

    public static final LinkBankException CAN_NOT_MATCH_ORDER_ID = new LinkBankException(
            "error.bank.net.can_not_match_order_id");

    public static final LinkBankException NO_AMOUNT_FROM_EBANK = new LinkBankException(
            "error.bank.net.no_amount_from_bank");

    public static final LinkBankException CANNOT_LOAD_CERT = new LinkBankException(
            "error.bank.net.cannot_load_cert");

    public static final LinkBankException REACHLESS_RESPONSE = new LinkBankException(
            "error.merchant.reachless_response");

    public static final LinkBankException LOSE_REQUEST_DATA = new LinkBankException(
            "error.lose_request_data");

    public static final LinkBankException CANNOT_LINK_BANK = new LinkBankException(
            "error.bank.cannot_link_bank");

    public static final LinkBankException PARSE_RESPONSE_ERROR = new LinkBankException(
            "error.bank.parse_response_error");

    public static final LinkBankException INVALID_ORDER_TELPHONE = new LinkBankException(
            "error.bank.tel.invalid_order_telphone");

    public static final LinkBankException LOSE_RESPONSE_DATA = new LinkBankException(
            "error.lose_response_data");

    private String errorCode;

    public LinkBankException(String code) {
        super(code);
    }

    public LinkBankException(String code, Object arg) {
        super(code, arg);
    }

    public LinkBankException(String code, Object arg, String errorCode) {
        super(code, arg);
        this.errorCode = errorCode;
    }

    public LinkBankException(String code, Object[] args, String errorCode) {
        super(code, args);
        this.errorCode = errorCode;
    }

    public LinkBankException(String code, Object[] args, String errorCode,
            String defaultMessage) {
        super(code, args, defaultMessage);
        this.errorCode = errorCode;
    }

    public String getErrorCode() {
        return this.errorCode;
    }

    /**
     * 获取包含mac密钥规则描述的异常
     * 
     * @param macKeyDescription
     *            mac密钥规则描述
     * @return 包含mac密钥规则描述的异常
     */
    public static LinkBankException getInvalidMacKeyException(
            String macKeyDescription) {
        return new LinkBankException("error.bank.net.invalid_mac_key",
                macKeyDescription);
    }

    /**
     * 获取订单编号不存在的异常
     * 
     * @param orderId
     *            不存在的订单编号
     * @return 订单编号不存在的异常
     */
    public static LinkBankException getOrderIdNotExistsException(String orderId) {
        if (orderId == null || orderId.length() == 0) {
            return CAN_NOT_MATCH_ORDER_ID;
        }
        return new LinkBankException("error.bank.net.order_id_not_exists",
                orderId);
    }

    /**
     * 获取数据域为空字符串（长度为0）的异常
     * 
     * @param name
     *            数据域名称
     * @param errorCode
     *            错误码
     * @return 数据域为空字符串（长度为0）的异常
     */
    public static LinkBankException getEmptyException(String name,
            String errorCode) {
        return new LinkBankException("validation.format.empty", name, errorCode);
    }

    /**
     * 获取数据域为空的异常
     * 
     * @param name
     *            数据域名称
     * @param errorCode
     *            错误码
     * @return 数据域为空的异常
     */
    public static LinkBankException getNullException(String name,
            String errorCode) {
        return new LinkBankException("validation.format.null", name, errorCode);
    }

    /**
     * 获取数据域格式错误的异常
     * 
     * @param name
     *            数据域名称
     * @param value
     *            数据域值
     * @param errorCode
     *            错误码
     * @return 数据域格式错误的异常
     */
    public static LinkBankException getFormatUnmatchException(String name,
            String value, String errorCode) {
        return new LinkBankException("validation.format.unmatch", new String[] {
                name, value }, errorCode);
    }

    /**
     * 获取数据域格式错误的异常
     * 
     * @param name
     *            数据域名称
     * @param value
     *            数据域值
     * @param format
     *            数据域格式
     * @param example
     *            数据域格式举例
     * @param errorCode
     *            错误码
     * @return 数据域格式错误的异常
     */
    public static LinkBankException getFormatUnmatchException(String name,
            String value, String format, String example, String errorCode) {
        return new LinkBankException("validation.format.unmatch_with_valid",
                new String[] { name, value, format, example }, errorCode);
    }

    /**
     * 获取数据域枚举值取值无效的异常
     * 
     * @param name
     *            数据域名称
     * @param enumsDesc
     *            枚举值取值范围描述
     * @param errorCode
     *            错误码
     * @return 数据域枚举值取值无效的异常
     */
    public static LinkBankException getEnumInvalidException(String name,
            String enumsDesc, String errorCode) {
        return new LinkBankException("validation.enmu.invalid", new String[] {
                name, enumsDesc }, errorCode);
    }

    /**
     * 获取版本号错误的异常
     * 
     * @param validVersions
     *            版本号有效取值范围
     * @param errorCode
     *            错误码
     * @return 版本号错误的异常
     */
    public static LinkBankException getVersionInvalidException(
            String[] validVersions, String errorCode) {
        String enumsDesc = "";
        for (int i = 0; i < validVersions.length; i++) {
            enumsDesc += ", " + validVersions[i];
        }
        if (enumsDesc.length() > 2) {
            enumsDesc = enumsDesc.substring(2);
        }
        return new LinkBankException("validation.version.invalid", enumsDesc,
                errorCode);
    }

    /**
     * 获取被禁止的数据域异常
     * 
     * @param name
     *            数据域名称
     * @param errorCode
     *            错误码
     * @return 被禁止的数据域异常
     */
    public static LinkBankException getUnallowedFieldException(String errorCode) {
        return new LinkBankException("validation.format.unallowed",
                new Object[] {}, errorCode);
    }

    /**
     * 获取数字签名无法生成或校验的异常
     * 
     * @param message
     *            底层异常信息
     * @return 数字签名无法生成或校验的异常
     */
    public static LinkBankException getDigitalSignException(String message) {
        return new LinkBankException("error.bank.net.digital_sign_cannot_do",
                message);
    }

    /**
     * 获取不包含子账户的异常
     * 
     * @param merchantId
     *            商户编号
     * @param subAccountId
     *            子账户编号
     * @return 不包含子账户的异常
     */
    public static LinkBankException getNotContainsSubAccountException(
            String merchantId, String subAccountId) {
        return new LinkBankException("error.merchant.not_contains_subAccount",
                new Object[] { merchantId, subAccountId });
    }
}
